Code coverage report for src/view.js

Statements: 16.19% (17 / 105)      Branches: 0% (0 / 32)      Functions: 21.43% (3 / 14)      Lines: 16.5% (17 / 103)      Ignored: none     

All files » src/ » view.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 1971           1   1   1     1 1                             1                 1                                                                               1               1                                                     1         1       1                                         1                                               1                                           1     1        
System.register([], function (_export) {
  //NOTE: Adding a fragment to the document causes the nodes to be removed from the fragment.
  //NOTE: Adding to the fragment, causes the nodes to be removed from the document.
 
  "use strict";
 
  var View;
 
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
  return {
    setters: [],
    execute: function () {
      View = (function () {
        function View(fragment, behaviors, bindings, children, systemControlled, contentSelectors) {
          _classCallCheck(this, View);
 
          this.fragment = fragment;
          this.behaviors = behaviors;
          this.bindings = bindings;
          this.children = children;
          this.systemControlled = systemControlled;
          this.contentSelectors = contentSelectors;
          this.firstChild = fragment.firstChild;
          this.lastChild = fragment.lastChild;
          this.isBound = false;
          this.isAttached = false;
        }
 
        View.prototype.created = function created(executionContext) {
          var i,
              ii,
              behaviors = this.behaviors;
          for (i = 0, ii = behaviors.length; i < ii; ++i) {
            behaviors[i].created(executionContext);
          }
        };
 
        View.prototype.bind = function bind(executionContext, systemUpdate) {
          var context, behaviors, bindings, children, i, ii;
 
          if (systemUpdate && !this.systemControlled) {
            context = this.executionContext || executionContext;
          } else {
            context = executionContext || this.executionContext;
          }
 
          if (this.isBound) {
            if (this.executionContext === context) {
              return;
            }
 
            this.unbind();
          }
 
          this.isBound = true;
          this.executionContext = context;
 
          if (this.owner) {
            this.owner.bind(context);
          }
 
          bindings = this.bindings;
          for (i = 0, ii = bindings.length; i < ii; ++i) {
            bindings[i].bind(context);
          }
 
          behaviors = this.behaviors;
          for (i = 0, ii = behaviors.length; i < ii; ++i) {
            behaviors[i].bind(context);
          }
 
          children = this.children;
          for (i = 0, ii = children.length; i < ii; ++i) {
            children[i].bind(context, true);
          }
        };
 
        View.prototype.addBinding = function addBinding(binding) {
          this.bindings.push(binding);
 
          if (this.isBound) {
            binding.bind(this.executionContext);
          }
        };
 
        View.prototype.unbind = function unbind() {
          var behaviors, bindings, children, i, ii;
 
          if (this.isBound) {
            this.isBound = false;
 
            if (this.owner) {
              this.owner.unbind();
            }
 
            bindings = this.bindings;
            for (i = 0, ii = bindings.length; i < ii; ++i) {
              bindings[i].unbind();
            }
 
            behaviors = this.behaviors;
            for (i = 0, ii = behaviors.length; i < ii; ++i) {
              behaviors[i].unbind();
            }
 
            children = this.children;
            for (i = 0, ii = children.length; i < ii; ++i) {
              children[i].unbind();
            }
          }
        };
 
        View.prototype.insertNodesBefore = function insertNodesBefore(refNode) {
          var parent = refNode.parentNode;
          parent.insertBefore(this.fragment, refNode);
        };
 
        View.prototype.appendNodesTo = function appendNodesTo(parent) {
          parent.appendChild(this.fragment);
        };
 
        View.prototype.removeNodes = function removeNodes() {
          var start = this.firstChild,
              end = this.lastChild,
              fragment = this.fragment,
              next;
 
          var current = start,
              loop = true,
              nodes = [];
 
          while (loop) {
            if (current === end) {
              loop = false;
            }
 
            next = current.nextSibling;
            this.fragment.appendChild(current);
            current = next;
          }
        };
 
        View.prototype.attached = function attached() {
          var behaviors, children, i, ii;
 
          if (this.isAttached) {
            return;
          }
 
          this.isAttached = true;
 
          if (this.owner) {
            this.owner.attached();
          }
 
          behaviors = this.behaviors;
          for (i = 0, ii = behaviors.length; i < ii; ++i) {
            behaviors[i].attached();
          }
 
          children = this.children;
          for (i = 0, ii = children.length; i < ii; ++i) {
            children[i].attached();
          }
        };
 
        View.prototype.detached = function detached() {
          var behaviors, children, i, ii;
 
          if (this.isAttached) {
            this.isAttached = false;
 
            if (this.owner) {
              this.owner.detached();
            }
 
            behaviors = this.behaviors;
            for (i = 0, ii = behaviors.length; i < ii; ++i) {
              behaviors[i].detached();
            }
 
            children = this.children;
            for (i = 0, ii = children.length; i < ii; ++i) {
              children[i].detached();
            }
          }
        };
 
        return View;
      })();
 
      _export("View", View);
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmcvc3JjL3ZpZXcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O01BR2EsSUFBSTs7Ozs7OztBQUFKLFVBQUk7QUFDSixpQkFEQSxJQUFJLENBQ0gsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFDO2dDQUQ3RSxJQUFJOztBQUViLGNBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLGNBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0FBQzNCLGNBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLGNBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLGNBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUN6QyxjQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7QUFDekMsY0FBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO0FBQ3RDLGNBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUNwQyxjQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUNyQixjQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztTQUN6Qjs7QUFaVSxZQUFJLFdBY2YsT0FBTyxHQUFBLGlCQUFDLGdCQUFnQixFQUFDO0FBQ3ZCLGNBQUksQ0FBQztjQUFFLEVBQUU7Y0FBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUN0QyxlQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBQztBQUM1QyxxQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9B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QUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7QUFFL0IsY0FBRyxJQUFJLENBQUMsVUFBVSxFQUFDO0FBQ2pCLGdCQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQzs7QUFFeEIsZ0JBQUcsSUFBSSxDQUFDLEtBQUssRUFBQztBQUNaLGtCQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ3ZCOztBQUVELHFCQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUMzQixpQkFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUM7QUFDNUMsdUJBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUN6Qjs7QUFFRCxvQkFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDekIsaUJBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDO0FBQzNDLHNCQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDeEI7V0FDRjtTQUNGOztlQTFLVSxJQUFJOzs7c0JBQUosSUFBSSIsImZpbGUiOiIvVXNlcnMvRWlzZW5iZXJnRWZmZWN0L0RvY3VtZW50cy9HaXRIdWIvVGhlIER1cmFuZGFsIFByb2plY3QvYXVyZWxpYS90ZW1wbGF0aW5nL3NyYy92aWV3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy9OT1RFOiBBZGRpbmcgYSBmcmFnbWVudCB0byB0aGUgZG9jdW1lbnQgY2F1c2VzIHRoZSBub2RlcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGZyYWdtZW50LlxuLy9OT1RFOiBBZGRpbmcgdG8gdGhlIGZyYWdtZW50LCBjYXVzZXMgdGhlIG5vZGVzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQuXG5cbmV4cG9ydCBjbGFzcyBWaWV3IHtcbiAgY29uc3RydWN0b3IoZnJhZ21lbnQsIGJlaGF2aW9ycywgYmluZGluZ3MsIGNoaWxkcmVuLCBzeXN0ZW1Db250cm9sbGVkLCBjb250ZW50U2VsZWN0b3JzKXtcbiAgICB0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQ7XG4gICAgdGhpcy5iZWhhdmlvcnMgPSBiZWhhdmlvcnM7XG4gICAgdGhpcy5iaW5kaW5ncyA9IGJpbmRpbmdzO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB0aGlzLnN5c3RlbUNvbnRyb2xsZWQgPSBzeXN0ZW1Db250cm9sbGVkO1xuICAgIHRoaXMuY29udGVudFNlbGVjdG9ycyA9IGNvbnRlbnRTZWxlY3RvcnM7XG4gICAgdGhpcy5maXJzdENoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcbiAgICB0aGlzLmxhc3RDaGlsZCA9IGZyYWdtZW50Lmxhc3RDaGlsZDtcbiAgICB0aGlzLmlzQm91bmQgPSBmYWxzZTtcbiAgICB0aGlzLmlzQXR0YWNoZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGNyZWF0ZWQoZXhlY3V0aW9uQ29udGV4dCl7XG4gICAgdmFyIGksIGlpLCBiZWhhdmlvcnMgPSB0aGlzLmJlaGF2aW9ycztcbiAgICBmb3IoaSA9IDAsIGlpID0gYmVoYXZpb3JzLmxlbmd0aDsgaSA8IGlpOyArK2kpe1xuICAgICAgYmVoYXZpb3JzW2ldLmNyZWF0ZWQoZXhlY3V0aW9uQ29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgYmluZChleGVjdXRpb25Db250ZXh0LCBzeXN0ZW1VcGRhdGUpe1xuICAgIHZhciBjb250ZXh0LCBiZWhhdmlvcnMsIGJpbmRpbmdzLCBjaGlsZHJlbiwgaSwgaWk7XG5cbiAgICBpZihzeXN0ZW1VcGRhdGUgJiYgIXRoaXMuc3lzdGVtQ29udHJvbGxlZCl7XG4gICAgICBjb250ZXh0ID0gdGhpcy5leGVjdXRpb25Db250ZXh0IHx8IGV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgfWVsc2V7XG4gICAgICBjb250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dCB8fCB0aGlzLmV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYodGhpcy5pc0JvdW5kKXtcbiAgICAgIGlmKHRoaXMuZXhlY3V0aW9uQ29udGV4dCA9PT0gY29udGV4dCl7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy51bmJpbmQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzQm91bmQgPSB0cnVlO1xuICAgIHRoaXMuZXhlY3V0aW9uQ29udGV4dCA9IGNvbnRleHQ7XG5cbiAgICBpZih0aGlzLm93bmVyKXtcbiAgICAgIHRoaXMub3duZXIuYmluZChjb250ZXh0KTtcbiAgICB9XG5cbiAgICBiaW5kaW5ncyA9IHRoaXMuYmluZGluZ3M7XG4gICAgZm9yKGkgPSAwLCBpaSA9IGJpbmRpbmdzLmxlbmd0aDsgaSA8IGlpOyArK2kpe1xuICAgICAgYmluZGluZ3NbaV0uYmluZChjb250ZXh0KTtcbiAgICB9XG5cbiAgICBiZWhhdmlvcnMgPSB0aGlzLmJlaGF2aW9ycztcbiAgICBmb3IoaSA9IDAsIGlpID0gYmVoYXZpb3JzLmxlbmd0aDsgaSA8IGlpOyArK2kpe1xuICAgICAgYmVoYXZpb3JzW2ldLmJpbmQoY29udGV4dCk7XG4gICAgfVxuXG4gICAgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuICAgIGZvcihpID0gMCwgaWkgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBpaTsgKytpKXtcbiAgICAgIGNoaWxkcmVuW2ldLmJpbmQoY29udGV4dCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgYWRkQmluZGluZyhiaW5kaW5nKXtcbiAgICB0aGlzLmJpbmRpbmdzLnB1c2goYmluZGluZyk7XG5cbiAgICBpZih0aGlzLmlzQm91bmQpe1xuICAgICAgYmluZGluZy5iaW5kKHRoaXMuZXhlY3V0aW9uQ29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgdW5iaW5kKCl7XG4gICAgdmFyIGJlaGF2aW9ycywgYmluZGluZ3MsIGNoaWxkcmVuLCBpLCBpaTtcblxuICAgIGlmKHRoaXMuaXNCb3VuZCl7XG4gICAgICB0aGlzLmlzQm91bmQgPSBmYWxzZTtcblxuICAgICAgaWYodGhpcy5vd25lcil7XG4gICAgICAgIHRoaXMub3duZXIudW5iaW5kKCk7XG4gICAgICB9XG5cbiAgICAgIGJpbmRpbmdzID0gdGhpcy5iaW5kaW5ncztcbiAgICAgIGZvcihpID0gMCwgaWkgPSBiaW5kaW5ncy5sZW5ndGg7IGkgPCBpaTsgKytpKXtcbiAgICAgICAgYmluZGluZ3NbaV0udW5iaW5kKCk7XG4gICAgICB9XG5cbiAgICAgIGJlaGF2aW9ycyA9IHRoaXMuYmVoYXZpb3JzO1xuICAgICAgZm9yKGkgPSAwLCBpaSA9IGJlaGF2aW9ycy5sZW5ndGg7IGkgPCBpaTsgKytpKXtcbiAgICAgICAgYmVoYXZpb3JzW2ldLnVuYmluZCgpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG4gICAgICBmb3IoaSA9IDAsIGlpID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICAgIGNoaWxkcmVuW2ldLnVuYmluZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGluc2VydE5vZGVzQmVmb3JlKHJlZk5vZGUpe1xuICAgIHZhciBwYXJlbnQgPSByZWZOb2RlLnBhcmVudE5vZGU7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLmZyYWdtZW50LCByZWZOb2RlKTtcbiAgfVxuXG4gIGFwcGVuZE5vZGVzVG8ocGFyZW50KXtcbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudCk7XG4gIH1cblxuICByZW1vdmVOb2Rlcygpe1xuICAgIHZhciBzdGFydCA9IHRoaXMuZmlyc3RDaGlsZCxcbiAgICAgICAgZW5kID0gdGhpcy5sYXN0Q2hpbGQsXG4gICAgICAgIGZyYWdtZW50ID0gdGhpcy5mcmFnbWVudCxcbiAgICAgICAgbmV4dDtcblxuICAgIHZhciBjdXJyZW50ID0gc3RhcnQsXG4gICAgICAgIGxvb3AgPSB0cnVlLFxuICAgICAgICBub2RlcyA9IFtdO1xuXG4gICAgd2hpbGUobG9vcCl7XG4gICAgICBpZihjdXJyZW50ID09PSBlbmQpe1xuICAgICAgICBsb29wID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIG5leHQgPSBjdXJyZW50Lm5leHRTaWJsaW5nO1xuICAgICAgdGhpcy5mcmFnbWVudC5hcHBlbmRDaGlsZChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSBuZXh0O1xuICAgIH1cbiAgfVxuXG4gIGF0dGFjaGVkKCl7XG4gICAgdmFyIGJlaGF2aW9ycywgY2hpbGRyZW4sIGksIGlpO1xuXG4gICAgaWYodGhpcy5pc0F0dGFjaGVkKXtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzQXR0YWNoZWQgPSB0cnVlO1xuXG4gICAgaWYodGhpcy5vd25lcil7XG4gICAgICB0aGlzLm93bmVyLmF0dGFjaGVkKCk7XG4gICAgfVxuXG4gICAgYmVoYXZpb3JzID0gdGhpcy5iZWhhdmlvcnM7XG4gICAgZm9yKGkgPSAwLCBpaSA9IGJlaGF2aW9ycy5sZW5ndGg7IGkgPCBpaTsgKytpKXtcbiAgICAgIGJlaGF2aW9yc1tpXS5hdHRhY2hlZCgpO1xuICAgIH1cblxuICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcbiAgICBmb3IoaSA9IDAsIGlpID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICBjaGlsZHJlbltpXS5hdHRhY2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGRldGFjaGVkKCl7XG4gICAgdmFyIGJlaGF2aW9ycywgY2hpbGRyZW4sIGksIGlpO1xuXG4gICAgaWYodGhpcy5pc0F0dGFjaGVkKXtcbiAgICAgIHRoaXMuaXNBdHRhY2hlZCA9IGZhbHNlO1xuXG4gICAgICBpZih0aGlzLm93bmVyKXtcbiAgICAgICAgdGhpcy5vd25lci5kZXRhY2hlZCgpO1xuICAgICAgfVxuXG4gICAgICBiZWhhdmlvcnMgPSB0aGlzLmJlaGF2aW9ycztcbiAgICAgIGZvcihpID0gMCwgaWkgPSBiZWhhdmlvcnMubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICAgIGJlaGF2aW9yc1tpXS5kZXRhY2hlZCgpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG4gICAgICBmb3IoaSA9IDAsIGlpID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICAgIGNoaWxkcmVuW2ldLmRldGFjaGVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=